﻿2026-05-13T07:14:01.3781833Z ##[group]Run pnpm verify:phase-5
2026-05-13T07:14:01.3782198Z [36;1mpnpm verify:phase-5[0m
2026-05-13T07:14:01.3796111Z shell: /usr/bin/bash -e {0}
2026-05-13T07:14:01.3796373Z env:
2026-05-13T07:14:01.3796615Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-13T07:14:01.3796922Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-13T07:14:01.3797142Z   SKIP_TRACE_CHECK: 1
2026-05-13T07:14:01.3797341Z ##[endgroup]
2026-05-13T07:14:01.6549645Z 
2026-05-13T07:14:01.6684768Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-13T07:14:01.6685875Z > node scripts/verify-phase-5.mjs
2026-05-13T07:14:01.6686575Z 
2026-05-13T07:14:01.6899722Z 
2026-05-13T07:14:01.6900666Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-13T07:14:01.6901701Z >>> pnpm verify:phase-4
2026-05-13T07:14:01.9928442Z 
2026-05-13T07:14:01.9929065Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-13T07:14:01.9929791Z > node scripts/verify-phase-4.mjs
2026-05-13T07:14:01.9930110Z 
2026-05-13T07:14:02.0153471Z 
2026-05-13T07:14:02.0154532Z === Workspace: typecheck ===
2026-05-13T07:14:02.0155271Z >>> pnpm -r typecheck
2026-05-13T07:14:02.3199566Z Scope: 5 of 6 workspace projects
2026-05-13T07:14:02.3285245Z packages/db typecheck$ tsc --noEmit
2026-05-13T07:14:02.3305315Z packages/game-logic typecheck$ tsc --noEmit
2026-05-13T07:14:04.8989363Z packages/game-logic typecheck: Done
2026-05-13T07:14:04.9005818Z packages/protocol typecheck$ tsc --noEmit
2026-05-13T07:14:06.8925327Z packages/db typecheck: Done
2026-05-13T07:14:08.1370758Z packages/protocol typecheck: Done
2026-05-13T07:14:08.1377671Z apps/client typecheck$ tsc --noEmit
2026-05-13T07:14:08.1395090Z apps/server typecheck$ tsc --noEmit
2026-05-13T07:14:18.9075903Z apps/client typecheck: Done
2026-05-13T07:14:19.8423543Z apps/server typecheck: Done
2026-05-13T07:14:19.8498701Z 
2026-05-13T07:14:19.8499475Z === Lint: protocol-sync ===
2026-05-13T07:14:19.8500195Z >>> pnpm lint:protocol-sync
2026-05-13T07:14:20.1306130Z 
2026-05-13T07:14:20.1307212Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-13T07:14:20.1308197Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-13T07:14:20.1308731Z 
2026-05-13T07:14:20.1589066Z lint-protocol-sync: OK
2026-05-13T07:14:20.1684864Z 
2026-05-13T07:14:20.1685774Z === Lint: game-logic-purity ===
2026-05-13T07:14:20.1686690Z >>> pnpm lint:game-logic-purity
2026-05-13T07:14:20.4484001Z 
2026-05-13T07:14:20.4485254Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-13T07:14:20.4486366Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-13T07:14:20.4486892Z 
2026-05-13T07:14:20.4790851Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-13T07:14:20.4877543Z 
2026-05-13T07:14:20.4878297Z === Lint: better-auth-schema-sync ===
2026-05-13T07:14:20.4879158Z >>> pnpm lint:better-auth-schema-sync
2026-05-13T07:14:20.7685350Z 
2026-05-13T07:14:20.7686505Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-13T07:14:20.7687626Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-13T07:14:20.7688234Z 
2026-05-13T07:14:22.0838629Z lint-better-auth-schema-sync: OK
2026-05-13T07:14:22.0934853Z 
2026-05-13T07:14:22.0935576Z === Lint: rate-limit-budgets ===
2026-05-13T07:14:22.0936300Z >>> pnpm lint:rate-limit-budgets
2026-05-13T07:14:22.3762116Z 
2026-05-13T07:14:22.3763289Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-13T07:14:22.3764520Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-13T07:14:22.3765050Z 
2026-05-13T07:14:22.4048860Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-13T07:14:22.4137176Z 
2026-05-13T07:14:22.4137981Z === Lint: no-clipboard-rce ===
2026-05-13T07:14:22.4138831Z >>> pnpm lint:no-clipboard-rce
2026-05-13T07:14:22.7020791Z 
2026-05-13T07:14:22.7025476Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-13T07:14:22.7026683Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-13T07:14:22.7027530Z 
2026-05-13T07:14:22.7339670Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-13T07:14:22.7431973Z 
2026-05-13T07:14:22.7432525Z === Lint: room-layout ===
2026-05-13T07:14:22.7433145Z >>> pnpm lint:room-layout
2026-05-13T07:14:23.0266186Z 
2026-05-13T07:14:23.0267209Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-13T07:14:23.0268495Z > node tools/scripts/lint-room-layout.mjs
2026-05-13T07:14:23.0269047Z 
2026-05-13T07:14:23.0613409Z lint-room-layout: OK
2026-05-13T07:14:23.0703530Z 
2026-05-13T07:14:23.0704411Z === ADR 0004 lint ===
2026-05-13T07:14:23.0704968Z >>> pnpm lint:adr:0004
2026-05-13T07:14:23.3646672Z 
2026-05-13T07:14:23.3650625Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-13T07:14:23.3652168Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-13T07:14:23.3652990Z 
2026-05-13T07:14:23.3956067Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T07:14:23.4046144Z 
2026-05-13T07:14:23.4046929Z === Drizzle: emit-check ===
2026-05-13T07:14:23.4048440Z >>> pnpm db:emit-check
2026-05-13T07:14:23.6871889Z 
2026-05-13T07:14:23.6873078Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-13T07:14:23.6882759Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-13T07:14:23.6885975Z 
2026-05-13T07:14:24.1039113Z No config path provided, using default 'drizzle.config.ts'
2026-05-13T07:14:24.1040015Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-13T07:14:24.4382721Z 8 tables
2026-05-13T07:14:24.4383590Z accounts 8 columns 1 indexes 0 fks
2026-05-13T07:14:24.4385666Z audit_log 6 columns 0 indexes 2 fks
2026-05-13T07:14:24.4386228Z characters 9 columns 0 indexes 1 fks
2026-05-13T07:14:24.4386785Z inventory_items 4 columns 0 indexes 1 fks
2026-05-13T07:14:24.4387535Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-13T07:14:24.4388212Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-13T07:14:24.4388798Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-13T07:14:24.4389356Z sessions 5 columns 0 indexes 1 fks
2026-05-13T07:14:24.4389648Z 
2026-05-13T07:14:24.4390205Z No schema changes, nothing to migrate 😴
2026-05-13T07:14:24.5545238Z 
2026-05-13T07:14:24.5546028Z === Drizzle: schema-sync ===
2026-05-13T07:14:24.5546919Z >>> pnpm lint:schema-sync
2026-05-13T07:14:24.8356253Z 
2026-05-13T07:14:24.8357348Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-13T07:14:24.8366484Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-13T07:14:24.8368814Z 
2026-05-13T07:14:24.8636773Z OK
2026-05-13T07:14:24.8735720Z 
2026-05-13T07:14:24.8736501Z === Drizzle: source-comments ===
2026-05-13T07:14:24.8737343Z >>> pnpm lint:source-comments
2026-05-13T07:14:25.1568888Z 
2026-05-13T07:14:25.1569913Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-13T07:14:25.1571044Z > pnpm -C packages/db run lint:source-comments
2026-05-13T07:14:25.1571585Z 
2026-05-13T07:14:25.4417977Z 
2026-05-13T07:14:25.4419026Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-13T07:14:25.4420019Z > node scripts/check-source-comments.mjs
2026-05-13T07:14:25.4420602Z 
2026-05-13T07:14:25.4707377Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-13T07:14:25.4866967Z 
2026-05-13T07:14:25.4867745Z === Workspace: test ===
2026-05-13T07:14:25.4868406Z >>> pnpm -r test
2026-05-13T07:14:25.7735864Z Scope: 5 of 6 workspace projects
2026-05-13T07:14:25.7785695Z packages/db test$ vitest run
2026-05-13T07:14:25.7793712Z packages/game-logic test$ vitest run
2026-05-13T07:14:26.2870189Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-13T07:14:26.2892924Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-13T07:14:26.6846825Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-13T07:14:26.9236267Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T07:14:27.1416069Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:14:27.2495775Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T07:14:27.3654351Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:14:27.4693199Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:14:27.5826413Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:14:27.7956270Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:14:28.0016382Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:14:28.2027095Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:14:28.2796085Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:14:28.2855538Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-13T07:14:28.2915686Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-13T07:14:28.2924978Z packages/db test: [2m   Start at [22m 07:14:26
2026-05-13T07:14:28.2942617Z packages/db test: [2m   Duration [22m 1.99s[2m (transform 186ms, setup 0ms, import 1.40s, tests 28ms, environment 0ms)[22m
2026-05-13T07:14:28.3120870Z packages/db test: Done
2026-05-13T07:14:28.3127572Z packages/protocol test$ vitest run
2026-05-13T07:14:28.4290642Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:14:28.6395040Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:14:28.6559290Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-13T07:14:28.6560543Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-13T07:14:28.6561523Z packages/game-logic test: [2m   Start at [22m 07:14:26
2026-05-13T07:14:28.6562982Z packages/game-logic test: [2m   Duration [22m 2.35s[2m (transform 201ms, setup 0ms, import 388ms, tests 88ms, environment 1ms)[22m
2026-05-13T07:14:28.6867618Z packages/game-logic test: Done
2026-05-13T07:14:28.7778860Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-13T07:14:29.0449217Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T07:14:29.1926369Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:14:29.3429428Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:29.4827085Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:29.4882731Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-13T07:14:29.4884439Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-13T07:14:29.4886828Z packages/protocol test: [2m   Start at [22m 07:14:28
2026-05-13T07:14:29.4888138Z packages/protocol test: [2m   Duration [22m 701ms[2m (transform 116ms, setup 0ms, import 208ms, tests 27ms, environment 0ms)[22m
2026-05-13T07:14:29.5147253Z packages/protocol test: Done
2026-05-13T07:14:29.5152182Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-13T07:14:29.5154681Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-13T07:14:30.0609290Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-13T07:14:30.0876038Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-13T07:14:31.0186549Z apps/server test: {"level":30,"time":1778656471012,"pid":4783,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-13T07:14:31.0245992Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 692[2mms[22m[39m
2026-05-13T07:14:31.0255924Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 539[2mms[22m[39m
2026-05-13T07:14:31.8986795Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-13T07:14:31.9005998Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-13T07:14:31.9807171Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 233[2mms[22m[39m
2026-05-13T07:14:32.2501891Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 65[2mms[22m[39m
2026-05-13T07:14:33.0331578Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 126[2mms[22m[39m
2026-05-13T07:14:33.2032697Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-13T07:14:33.2043508Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Hcz1Xz/rebno.db
2026-05-13T07:14:33.2046092Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:14:33.2048878Z apps/server test: [run-migrations] OK
2026-05-13T07:14:33.2116442Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-13T07:14:33.2123356Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-iVmvQE/rebno.db
2026-05-13T07:14:33.2125785Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:14:33.2132826Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-13T07:14:33.2145947Z apps/server test: [run-migrations] OK
2026-05-13T07:14:33.2177751Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T07:14:33.2203339Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-QTcrEP/rebno.db
2026-05-13T07:14:33.2209759Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:14:33.2211632Z apps/server test: [run-migrations] OK
2026-05-13T07:14:33.2225482Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T07:14:33.2245512Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-QTcrEP/rebno.db
2026-05-13T07:14:33.2256229Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:14:33.2257531Z apps/server test: [run-migrations] OK
2026-05-13T07:14:33.2295545Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 42[2mms[22m[39m
2026-05-13T07:14:33.5305931Z apps/server test: {"level":40,"time":1778656473521,"pid":4869,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:14:33.5346132Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-13T07:14:33.5370547Z apps/server test: {"level":40,"time":1778656473524,"pid":4869,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:14:33.5465628Z apps/server test: {"level":40,"time":1778656473525,"pid":4869,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:14:33.7810430Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-13T07:14:33.9946499Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:14:34.1699999Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 142[2mms[22m[39m
2026-05-13T07:14:34.2596487Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-13T07:14:34.5630394Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-13T07:14:34.7884462Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T07:14:35.3791311Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 125[2mms[22m[39m
2026-05-13T07:14:35.5035961Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-13T07:14:35.5037414Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-13T07:14:35.5038644Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-13T07:14:36.2777561Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:14:36.4556354Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 115[2mms[22m[39m
2026-05-13T07:14:36.4724962Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:14:36.4792685Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-13T07:14:36.4831746Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-13T07:14:36.4845415Z apps/server test: [2m   Start at [22m 07:14:30
2026-05-13T07:14:36.4846909Z apps/server test: [2m   Duration [22m 6.40s[2m (transform 478ms, setup 0ms, import 3.26s, tests 901ms, environment 2ms)[22m
2026-05-13T07:14:36.5282985Z apps/server test: Done
2026-05-13T07:14:37.1195645Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 63[2mms[22m[39m
2026-05-13T07:14:37.7470185Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-13T07:14:38.3526236Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 29[2mms[22m[39m
2026-05-13T07:14:39.0148734Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T07:14:39.6234071Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:14:40.2373270Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-13T07:14:40.8314326Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:14:41.4304064Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:14:42.0183859Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:14:42.5931402Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:14:43.1791644Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:14:43.7659481Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:14:44.3294828Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:14:44.9080154Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:14:45.4937926Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:46.0624483Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:46.6305666Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:47.2234423Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:47.8091213Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-13T07:14:47.8260069Z apps/client test: [2m Test Files [22m [1m[32m24 passed[39m[22m[90m (24)[39m
2026-05-13T07:14:47.8269216Z apps/client test: [2m      Tests [22m [1m[32m183 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (187)[39m
2026-05-13T07:14:47.8270717Z apps/client test: [2m   Start at [22m 07:14:30
2026-05-13T07:14:47.8272440Z apps/client test: [2m   Duration [22m 17.77s[2m (transform 819ms, setup 65ms, collect 1.20s, tests 967ms, environment 10.02s, prepare 2.02s)[22m
2026-05-13T07:14:47.9485754Z apps/client test: Done
2026-05-13T07:14:47.9541106Z 
2026-05-13T07:14:47.9542918Z verify-phase-4: OK (12 steps green)
2026-05-13T07:14:47.9633114Z 
2026-05-13T07:14:47.9633985Z === Workspace: typecheck ===
2026-05-13T07:14:47.9635374Z >>> pnpm -r typecheck
2026-05-13T07:14:48.2485895Z Scope: 5 of 6 workspace projects
2026-05-13T07:14:48.2536074Z packages/db typecheck$ tsc --noEmit
2026-05-13T07:14:48.2544492Z packages/game-logic typecheck$ tsc --noEmit
2026-05-13T07:14:50.6615352Z packages/game-logic typecheck: Done
2026-05-13T07:14:50.6645113Z packages/protocol typecheck$ tsc --noEmit
2026-05-13T07:14:52.8950306Z packages/db typecheck: Done
2026-05-13T07:14:54.0298509Z packages/protocol typecheck: Done
2026-05-13T07:14:54.0304880Z apps/client typecheck$ tsc --noEmit
2026-05-13T07:14:54.0307876Z apps/server typecheck$ tsc --noEmit
2026-05-13T07:15:05.0495622Z apps/client typecheck: Done
2026-05-13T07:15:05.7826604Z apps/server typecheck: Done
2026-05-13T07:15:05.7899020Z 
2026-05-13T07:15:05.7899748Z === Lint: deploy-stack ===
2026-05-13T07:15:05.7900597Z >>> pnpm lint:deploy-stack
2026-05-13T07:15:06.0690757Z 
2026-05-13T07:15:06.0691823Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-13T07:15:06.0692827Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-13T07:15:06.0693345Z 
2026-05-13T07:15:06.1001178Z lint-deploy-stack: OK
2026-05-13T07:15:06.1093305Z 
2026-05-13T07:15:06.1094267Z === Lint: deploy-stack test ===
2026-05-13T07:15:06.1095198Z >>> pnpm lint:deploy-stack:test
2026-05-13T07:15:06.3902127Z 
2026-05-13T07:15:06.3903273Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-13T07:15:06.3904491Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-13T07:15:06.3905064Z 
2026-05-13T07:15:06.4474650Z PASS: lint-deploy-stack green
2026-05-13T07:15:06.4570380Z 
2026-05-13T07:15:06.4571052Z === ADR 0005 lint ===
2026-05-13T07:15:06.4571854Z >>> pnpm lint:adr:0005
2026-05-13T07:15:06.7384581Z 
2026-05-13T07:15:06.7385605Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-13T07:15:06.7386898Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-13T07:15:06.7387677Z 
2026-05-13T07:15:06.7671206Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T07:15:06.7769620Z 
2026-05-13T07:15:06.7770346Z === ADR 0006 lint ===
2026-05-13T07:15:06.7770993Z >>> pnpm lint:adr:0006
2026-05-13T07:15:07.0611693Z 
2026-05-13T07:15:07.0612767Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-13T07:15:07.0614277Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-13T07:15:07.0615087Z 
2026-05-13T07:15:07.0905280Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T07:15:07.1002597Z 
2026-05-13T07:15:07.1007422Z === Workspace: test ===
2026-05-13T07:15:07.1008306Z >>> pnpm -r test
2026-05-13T07:15:07.3907198Z Scope: 5 of 6 workspace projects
2026-05-13T07:15:07.3956205Z packages/db test$ vitest run
2026-05-13T07:15:07.3964793Z packages/game-logic test$ vitest run
2026-05-13T07:15:07.9086426Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-13T07:15:07.9088431Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-13T07:15:08.3047691Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-13T07:15:08.5349864Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T07:15:08.7677250Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:15:08.8354062Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-13T07:15:08.9649043Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:15:09.1878396Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:09.3944504Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:09.5993994Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:09.6726652Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:15:09.8301233Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:15:09.8868116Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:09.8870139Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-13T07:15:09.8871847Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-13T07:15:09.8872981Z packages/db test: [2m   Start at [22m 07:15:07
2026-05-13T07:15:09.8876805Z packages/db test: [2m   Duration [22m 1.97s[2m (transform 166ms, setup 0ms, import 1.38s, tests 27ms, environment 0ms)[22m
2026-05-13T07:15:09.9117903Z packages/db test: Done
2026-05-13T07:15:09.9119035Z packages/protocol test$ vitest run
2026-05-13T07:15:10.0457186Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:10.2467609Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:10.2490432Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-13T07:15:10.2756367Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-13T07:15:10.2762443Z packages/game-logic test: [2m   Start at [22m 07:15:07
2026-05-13T07:15:10.2768058Z packages/game-logic test: [2m   Duration [22m 2.35s[2m (transform 220ms, setup 0ms, import 400ms, tests 82ms, environment 1ms)[22m
2026-05-13T07:15:10.2992336Z packages/game-logic test: Done
2026-05-13T07:15:10.3829350Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-13T07:15:10.6541666Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T07:15:10.8032892Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:15:10.9537398Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:15:11.0961803Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:15:11.1015858Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-13T07:15:11.1018746Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-13T07:15:11.1024614Z packages/protocol test: [2m   Start at [22m 07:15:10
2026-05-13T07:15:11.1026071Z packages/protocol test: [2m   Duration [22m 710ms[2m (transform 115ms, setup 0ms, import 210ms, tests 27ms, environment 0ms)[22m
2026-05-13T07:15:11.1280887Z packages/protocol test: Done
2026-05-13T07:15:11.1287003Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-13T07:15:11.1303977Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-13T07:15:11.6647481Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-13T07:15:11.6786057Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-13T07:15:12.6199724Z apps/server test: {"level":30,"time":1778656512615,"pid":5848,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-13T07:15:12.6247146Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 626[2mms[22m[39m
2026-05-13T07:15:12.6265957Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 505[2mms[22m[39m
2026-05-13T07:15:13.5861039Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-13T07:15:13.5906051Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-13T07:15:13.6736509Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 248[2mms[22m[39m
2026-05-13T07:15:13.7611691Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 42[2mms[22m[39m
2026-05-13T07:15:14.6796928Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-13T07:15:14.6816128Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-cmXikL/rebno.db
2026-05-13T07:15:14.6825411Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:15:14.6828446Z apps/server test: [run-migrations] OK
2026-05-13T07:15:14.6945230Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-13T07:15:14.6947562Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-eqaJFK/rebno.db
2026-05-13T07:15:14.6965525Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:15:14.6985818Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-13T07:15:14.7004893Z apps/server test: [run-migrations] OK
2026-05-13T07:15:14.7032292Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T07:15:14.7035318Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Ju9bjX/rebno.db
2026-05-13T07:15:14.7036777Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:15:14.7038496Z apps/server test: [run-migrations] OK
2026-05-13T07:15:14.7040675Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T07:15:14.7042682Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Ju9bjX/rebno.db
2026-05-13T07:15:14.7044358Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:15:14.7046665Z apps/server test: [run-migrations] OK
2026-05-13T07:15:14.7307587Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 49[2mms[22m[39m
2026-05-13T07:15:14.8256084Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 145[2mms[22m[39m
2026-05-13T07:15:14.9730976Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 21[2mms[22m[39m
2026-05-13T07:15:15.2887501Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-13T07:15:15.5516717Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-13T07:15:15.8431466Z apps/server test: {"level":40,"time":1778656515820,"pid":5959,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:15:15.8457483Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-13T07:15:15.8459406Z apps/server test: {"level":40,"time":1778656515823,"pid":5959,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:15:15.8462079Z apps/server test: {"level":40,"time":1778656515824,"pid":5959,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:15:15.9593252Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 133[2mms[22m[39m
2026-05-13T07:15:16.0599311Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T07:15:16.2865415Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:15:17.0735213Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-13T07:15:17.0741033Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-13T07:15:17.0742897Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-13T07:15:17.1313772Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 122[2mms[22m[39m
2026-05-13T07:15:17.8584442Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:18.0873239Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:18.0917038Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-13T07:15:18.0935454Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-13T07:15:18.0955985Z apps/server test: [2m   Start at [22m 07:15:11
2026-05-13T07:15:18.1008408Z apps/server test: [2m   Duration [22m 6.41s[2m (transform 480ms, setup 0ms, import 3.38s, tests 826ms, environment 7ms)[22m
2026-05-13T07:15:18.1346318Z apps/server test: Done
2026-05-13T07:15:18.1704891Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 81[2mms[22m[39m
2026-05-13T07:15:18.8389360Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 63[2mms[22m[39m
2026-05-13T07:15:19.4571241Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 34[2mms[22m[39m
2026-05-13T07:15:20.0826865Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-13T07:15:20.6878317Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-13T07:15:21.2979461Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:15:21.9752272Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:15:22.5728577Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:15:23.1800390Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:23.7564871Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:15:24.3611126Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:15:24.9605070Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:15:25.5599302Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:26.1381007Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:26.7396466Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:27.3296193Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:15:27.9083903Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:15:28.4815930Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:15:29.0746052Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:15:29.6473982Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-13T07:15:29.6657072Z apps/client test: [2m Test Files [22m [1m[32m24 passed[39m[22m[90m (24)[39m
2026-05-13T07:15:29.6670593Z apps/client test: [2m      Tests [22m [1m[32m183 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (187)[39m
2026-05-13T07:15:29.6671858Z apps/client test: [2m   Start at [22m 07:15:11
2026-05-13T07:15:29.6673451Z apps/client test: [2m   Duration [22m 17.98s[2m (transform 823ms, setup 72ms, collect 1.21s, tests 959ms, environment 10.22s, prepare 2.02s)[22m
2026-05-13T07:15:29.7855821Z apps/client test: Done
2026-05-13T07:15:29.7917880Z 
2026-05-13T07:15:29.7918386Z verify-phase-5: OK (7 steps green)
